package com.xx.rpc.core.util;

import java.util.concurrent.*;

/**
 * 线程池工具
 *
 * @author hanxiyue
 */
public class ThreadPoolUtil {

    /**
     * 创建服务端线程
     *
     * 1.线程数量未达到corePoolSize（核心线程数最大值），则新建一个线程(核心线程)执行任务
     * 2.线程数量达到了corePools，则将任务移入队列等待
     * 3.队列已满，新建线程(非核心线程)执行任务
     * 4.队列已满，总线程数又达到了maximumPoolSize(线程总数最大值)，就会由(RejectedExecutionHandler)抛出异常
     *
     * @param serverType   服务类型
     * @param corePoolSize 核心线程数最大值    建议60
     * @param maxPoolSize  线程总数最大值      建议300
     * @return 线程池
     */
    public static ThreadPoolExecutor makeServerThreadPool(final String serverType, int corePoolSize, int maxPoolSize) {
        return new ThreadPoolExecutor(
                corePoolSize,       //核心线程数最大值
                maxPoolSize,        //线程总数最大值
                60L,   //非核心线程闲置超时时长
                TimeUnit.SECONDS,   //keepAliveTime的单位  秒级
                new LinkedBlockingQueue<Runnable>(1000),//任务队列：维护着等待执行的Runnable对象
                new ThreadFactory() {
                    @Override
                    public Thread newThread(Runnable r) {
                        return new Thread(r, "xxl-rpc, " + serverType + "-serverHandlerPool-" + r.hashCode());
                    }
                },//创建线程的方式
                new RejectedExecutionHandler() {
                    @Override
                    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                        throw new XxRpcException("xxl-rpc " + serverType + " Thread pool is EXHAUSTED!");
                    }
                });//所有位置爆满则执行

    }

}
